昨天介紹完kmeans演算法,今天就要實際寫程式:
首先先創建一筆資料並繪圖:
程式如下:
import numpy as np
label_data=np.array([[45,59],[52,63],[18,52],[72,24],[20,36],[12,39],[53,23],[52,70],[45,63],[24,55],[33,46],[28,30],[29,54],[55,14],[61,8],[69,7],[64,19],[51,66]])
label_data_x=[label_data[i][0] for i in range(len(label_data))]
label_data_y=[label_data[i][1] for i in range(len(label_data))]
print(label_data_x)
print(label_data_y)
import matplotlib.pyplot as plt
plt.scatter(label_data_x,label_data_y)
plt.show()
結果如下:
之後寫出起始中心點位置:(設定d=3-->分3群)
#先決定要分幾群
d=3
#由於數據x,y最大值為70左右
import random
x_y_used=[]
color_used=[]
#設定種子
random.seed(150)
for i in range(d):
#避免重複中心點
while True:
x=random.randint(0,70)
y=random.randint(0,70)
if [x,y] not in x_y_used:
break
x_y_used.append([x,y])
#避免重複顏色
while True:
color_use = ["#"+''.join([random.choice('0123456789ABCDEF') for j in range(6)])]
if color_use not in color_used:
color_used.append(color_use)
break
plt.scatter(x,y,color=color_use)
plt.show()
結果如圖:
接下來針對這張圖的中心點我們去算歐式距離:(程式碼如下)
#幫資料分類
for i in range(len(label_data_x)):
k=[]
for j in range(d):
#計算歐式距離
value_k=np.sqrt((x_y_used[j][0]-label_data_x[i])**2+(x_y_used[j][1]-label_data_y[i])**2)
k.append(value_k)
#取最小
tmp = min(k)
index = k.index(tmp)
print("第",i+1,"筆資料為第",index+1,'類')
#畫在圖上
plt.scatter(label_data_x[i],label_data_y[i],color=color_used[index])
plt.show()
第 1 筆資料為第 1 類
第 2 筆資料為第 1 類
第 3 筆資料為第 1 類
第 4 筆資料為第 2 類
第 5 筆資料為第 3 類
第 6 筆資料為第 3 類
第 7 筆資料為第 2 類
第 8 筆資料為第 1 類
第 9 筆資料為第 1 類
第 10 筆資料為第 1 類
第 11 筆資料為第 1 類
第 12 筆資料為第 3 類
第 13 筆資料為第 1 類
第 14 筆資料為第 2 類
第 15 筆資料為第 2 類
第 16 筆資料為第 2 類
第 17 筆資料為第 2 類
第 18 筆資料為第 1 類
結果如圖:
接下來我們就可以利用這些新的點去找中心點,然後再算距離分類,直到分類不再變動為止
好,今天講解關於kmeans演算法程式一半,明天就要就繼續後半段的程式碼
狐狸抱著男子沖到了木屋裡,頓時兩個人都著起了火,男子不屑的冷笑,用手撥了撥身上的火焰,火焰瞬間被他吸收,因為火是他發出,它當然可以吸收,正當他得意看向狐狸卻發現狐狸雖然被火焰燃燒,卻像沒事一般,而傷口在火燒之後結痂,不再流血,男子用一種奇怪的表情望向著狐狸,隨即他彈了一個響指,火焰瞬間熄滅,只剩焦黑的木屋和對峙的兩人,正當兩人僵持不下時,屋外傳來了歌聲
--|你相信了什麼?你忘記了什麼?|-- CS.MM